home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / segment1.h < prev    next >
C/C++ Source or Header  |  1994-11-09  |  5KB  |  171 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  Segment1.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef LEDA_SEGMENTEXACT_H
  16. #define LEDA_SEGMENTEXACT_H
  17.  
  18. #include <LEDA/_Point1.h>
  19.  
  20. //------------------------------------------------------------------------------
  21. // Segments
  22. //------------------------------------------------------------------------------
  23.  
  24.  
  25. class Segment_rep : public handle_rep {
  26.  
  27. friend class Segment;
  28. //friend class Line;
  29. //friend class Circle;
  30.    
  31.    Point start;
  32.    Point end;
  33.  
  34.    Int dx;
  35.    Int dy;
  36.  
  37.   
  38. public:
  39.    
  40.    Segment_rep(const Point&, const Point&);
  41.    Segment_rep();  
  42.  
  43.   ~Segment_rep() {}
  44.  
  45.    
  46.    LEDA_MEMORY(Segment_rep)
  47.    
  48. };
  49.  
  50.  
  51. class Segment  : public handle_base 
  52. {
  53.  
  54. //friend class Line;
  55. //friend class Circle;
  56.  
  57. Segment_rep* ptr() const { return (Segment_rep*)PTR; }
  58.  
  59. public:
  60.  
  61.  Segment();                 
  62.  Segment(const Point&, const Point&); 
  63.  Segment(const Int&, const Int&, const Int&, const Int&);
  64. // Segment(const Point&, double dir, double length);
  65.  Segment(const Segment& s) : handle_base(s) {}     
  66. ~Segment()                { clear(); }
  67.  
  68. Segment& operator=(const Segment& s) { handle_base::operator=(s); return *this;}
  69.  
  70. //operator vector()  { return vector(xcoord2()-xcoord1(), ycoord2()-ycoord1()); }
  71.  
  72. bool intersection(const Segment& s, Point& inter) const;
  73.  
  74. bool intersection_of_lines(const Segment& s, Point& inter) const;
  75.  
  76.  
  77. Point start() const { return ptr()->start; }
  78. Point end()   const { return ptr()->end; }
  79.  
  80. double xcoord1() const { return ptr()->start.xcoord(); }
  81. double xcoord2() const { return ptr()->end.xcoord();   }
  82. double ycoord1() const { return ptr()->start.ycoord(); }
  83. double ycoord2() const { return ptr()->end.ycoord();   }
  84.  
  85. #if defined(__GNUG__)
  86. Int X1() const { return ptr()->start.X(); }
  87. Int X2() const { return ptr()->end.X();   }
  88. Int Y1() const { return ptr()->start.Y(); }
  89. Int Y2() const { return ptr()->end.Y();   }
  90. Int W1() const { return ptr()->start.W(); }
  91. Int W2() const { return ptr()->end.W();   }
  92. Int dx() const { return ptr()->dx; }
  93. Int dy() const { return ptr()->dy; }
  94. #else
  95. const Int& X1() const { return ptr()->start.X(); }
  96. const Int& X2() const { return ptr()->end.X();   }
  97. const Int& Y1() const { return ptr()->start.Y(); }
  98. const Int& Y2() const { return ptr()->end.Y();   }
  99. const Int& W1() const { return ptr()->start.W(); }
  100. const Int& W2() const { return ptr()->end.W();   }
  101. const Int& dx() const { return ptr()->dx; }
  102. const Int& dy() const { return ptr()->dy; }
  103. #endif
  104.  
  105. double XD1() const { return ptr()->start.XD(); }
  106. double XD2() const { return ptr()->end.XD();   }
  107. double YD1() const { return ptr()->start.YD(); }
  108. double YD2() const { return ptr()->end.YD();   }
  109. double WD1() const { return ptr()->start.WD(); }
  110. double WD2() const { return ptr()->end.WD();   }
  111.  
  112. double dxd() const { return Itodouble(ptr()->dx); }
  113. double dyd() const { return Itodouble(ptr()->dy); }
  114.  
  115. bool vertical()   const { return ptr()->dx == 0; }
  116. bool horizontal() const { return ptr()->dy == 0; }
  117.  
  118.  
  119. //double slope() const { return ptr()->slope; }
  120. //double y_abs() const { return ptr()->y_abs; }
  121.  
  122. //double angle()     const { return ptr()->angle; }
  123. //double direction() const { return angle(); }
  124.  
  125.  
  126. //double length() const { return start().distance(end()); }
  127.  
  128. //Segment translate(double,double) const;
  129. //Segment translate(const vector&) const;
  130.  
  131. //double  angle(const Segment&) const;
  132.  
  133. //double  distance(const Segment&) const;
  134. //double  distance(const Point&) const;
  135. //double  distance() const;
  136. //double  x_proj(double) const;
  137. //double  y_proj(double) const;
  138.  
  139. //double operator()(double x) { return y_proj(x); }
  140.  
  141. //Segment rotate(const Point&,double) const;
  142. //Segment rotate(double) const;
  143.  
  144. //bool  right()  const  { return ptr()->start.ptr()->x < ptr()->end.ptr()->x; }
  145. //bool  left()   const  { return ptr()->start.ptr()->x > ptr()->end.ptr()->x; }
  146. //bool  up()     const  { return ptr()->start.ptr()->y < ptr()->end.ptr()->y; }
  147. //bool  down()   const  { return ptr()->start.ptr()->y > ptr()->end.ptr()->y; }
  148.  
  149. //Segment operator+(const vector& v) const { return translate(v); }
  150.  
  151. int operator==(const Segment& s) const
  152. { return (ptr()->start == s.ptr()->start && ptr()->end == s.ptr()->end); }
  153.  
  154. int operator!=(const Segment& s) const { return !operator==(s);}
  155.  
  156. friend ostream& operator<<(ostream& out, const Segment& s);
  157. friend istream& operator>>(istream& in, Segment& s);
  158.  
  159. friend void Print(const Segment&, ostream&  =cout);
  160. friend void Read(Segment&,  istream& =cin);
  161.  
  162. };
  163.  
  164. inline void Print(const Segment& s, ostream& out) { out << s; } 
  165. inline void Read(Segment& s,  istream& in)        { in >> s; }
  166.  
  167. LEDA_HANDLE_TYPE(Segment)
  168.  
  169. #endif
  170.